breakpoint
操作符可以發送調試信號來暫停進程的運行(只要在給定的閉包中返回 true),當上游發佈任何消息時. 可用於製造 Debug 的中斷點的方法
func breakpointDemo() {
[1, 2].publisher
.breakpoint(receiveSubscription: { subscription in
return false // 返回 true 以拋出 SIGTRAP 中斷訊號,調試器會被調起
}, receiveOutput: { value in
return false // 返回 true 以拋出 SIGTRAP 中斷訊號,調試器會被調起
}, receiveCompletion: { completion in
return false // 返回 true 以拋出 SIGTRAP 中斷訊號,調試器會被調起
})
.sink(receiveValue: { _ in
})
.store(in: &cancellables)
}
從上面的示例程式碼中,我們可以看出,通過使用 breakpoint 操作符,我們可以很容易地在訂閱操作、輸出、完成發生時啟用斷點。
如果這時候想直接在程式碼上打斷點,我們就要重寫 sink 部分的程式碼,而且無法輕易地為訂閱操作啟用斷點
handleEvents 操作符可以在發布事件發生時執行指定的閉包,介入所有上游的事件, 不會因為 RELEASE/DEBUG 的前置處理器差異
func handleEventsDemo() {
[1, 2].publisher
.handleEvents(receiveSubscription: { subscription in
// 訂閱事件
}, receiveOutput: { value in
// 值事件
}, receiveCompletion: { completion in
// 完成事件
}, receiveCancel: {
// 取消事件
}, receiveRequest: { demand in
// 請求需求的事件
})
.sink(receiveValue: { _ in
})
.store(in: &cancellables)
}
zip 操作符會將上游發布者發布的元素結合到一個流中,在每個上游發布者發送的元素配對時才向下游發送一個包含配對元素的元組。
func zipDemo() {
let oddPublisher = PassthroughSubject<Int, Never>()
let evenStringPublisher = PassthroughSubject<String, Never>()
oddPublisher
.zip(evenStringPublisher)
.sink(receiveCompletion: { completion in
print(completion)
}, receiveValue: { value in
print(value)
})
.store(in: &cancellables)
oddPublisher.send(1)
evenStringPublisher.send("2")
oddPublisher.send(3)
evenStringPublisher.send("4")
evenStringPublisher.send("6")
evenStringPublisher.send("8")
}
/*印出
(1, "2")
(3, "4")
*/
merge 操作符可以將上游發布者發送的元素合併到一個序列中。merge 操作符要求上游發布者的輸出和失敗類型完全相同。
func mergeDemo() {
let oddPublisher = PassthroughSubject<Int, Never>()
let evenPublisher = PassthroughSubject<Int, Never>()
oddPublisher
.merge(with: evenPublisher)
.sink(receiveCompletion: { completion in
print(completion)
}, receiveValue: { value in
print(value)
})
.store(in: &cancellables)
oddPublisher.send(1)
evenPublisher.send(2)
oddPublisher.send(3)
evenPublisher.send(4)
}
/*印出
1
2
3
4
*/